package cn.tedu.d20_reflection2;
/*
 暴力反射
 */
import org.junit.Test;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class TestReflect2 {

    /*
     通过暴力反射获取和设置私有属性
     */
    @Test
    public void getField() throws Exception {
        //2.获取字节码对象
        Class<Person> personClass = Person.class;

        //3.获取属性(私有)
        Field name = personClass.getDeclaredField("name");
        //4.根据获取到的属性对象获取其类型,获取类型的字符串返回
        System.out.println(name.getType().getName());

        //5.设置属性值 set(m,n) m-哪个对象 n-设置什么值
        //5.1通过反射方式创建对象
        Object person = personClass.newInstance();

        //5.2暴力反射！！设置私有可见
        name.setAccessible(true);

        name.set(person,"孙悟空");
        System.out.println(name.get(person));
    }
    /*
     通过暴力反射获取和设置，私有方法
     */
    @Test
    public void getFunction() throws Exception {
        Class<?> clazz = Person.class;

        //暴力反射获取指定私有方法---------------字节码对象
        Method method = clazz.getDeclaredMethod("save", String.class, int.class);//parameterTypes

        //通过反射创建对象---用来调用方法
        Object obj=clazz.newInstance();

        //执行获取到的私有方法save()
        //invoke(n,x,y,z)
        method.setAccessible(true);
        method.invoke(obj,"猪八戒",100);

    }
}
